package demo7;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class Person {
    private String name;

    /**
     * 构造器是一个对象生命周期中的第一个方法,当一个对象实例化时
     * JVM首先为对象分配内存空间,初始化对象属性内存等.
     * 然后就会调用构造器方法
     */
    public Person(){
        System.out.println("Person的构造器执行了");
    }

    @Value("张三")
    public void setName(String name){
        System.out.println("Person的name属性对应的setName方法调用了...");
        this.name = name;
    }

    /**
     * @PostConstruct注解是一个生命周期注解
     * Spring在将该对象初始化完毕(构造器执行后,set方法执行后)会调用该方法
     * 该方法的方法名任意定义,重点是标注注解
     */
    @PostConstruct
    public void init(){
        System.out.println("Person对象被@PostConstruct标注的方法执行了...");
    }

    /**
     * @PreDestroy注解
     * 被该注解标注的方法的调用时机:
     * 当Spring容器关闭时,Spring容器会调用内部管理的对象的被@PreDestroy注解标注的方法
     */
    @PreDestroy
    public void preDestroy(){
        System.out.println("Person对象被@PreDestroy标注的方法执行了...");
    }
    /*
        (面试题)分别解释:final,finally,finalize分别是什么
        finalize是Object中定义的一个方法,这意味着所有的类都有该方法
        它是一个对象生命周期中的最后一个被调用方法:
        当GC发现一个对象没有任何引用时,就会将其销毁,销毁前最后会调用它的finalize方法
        该方法调用完毕对象被销毁.
        API手册中对该方法有明确说明它不应当有耗时的操作,否者会影响GC性能
     */
    @Override
    protected  void finalize() throws Throwable{
        super.finalize();
    }

}
